package com.yupi.yupicturebackend.service;

import com.yupi.yupicturebackend.model.dto.workflow.*;
import com.yupi.yupicturebackend.model.entity.CollaborationProject;
import com.yupi.yupicturebackend.model.entity.WorkflowInstance;

import java.util.List;
import java.util.Map;

/**
 * 协作服务
 *
 * @author yupi
 */
public interface CollaborationService {

    /**
     * 创建协作项目
     *
     * @param projectConfig 项目配置
     * @param userId 用户ID
     * @return 项目创建结果
     */
    ProjectCreationResult createCollaborationProject(CollaborationProjectConfig projectConfig, Long userId);

    /**
     * 更新项目信息
     *
     * @param projectId 项目ID
     * @param updateData 更新数据
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean updateProject(String projectId, Map<String, Object> updateData, Long userId);

    /**
     * 删除项目
     *
     * @param projectId 项目ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteProject(String projectId, Long userId);

    /**
     * 获取项目详情
     *
     * @param projectId 项目ID
     * @param userId 用户ID
     * @return 项目详情
     */
    CollaborationProject getProjectDetail(String projectId, Long userId);

    /**
     * 获取用户项目列表
     *
     * @param userId 用户ID
     * @param status 项目状态（可选）
     * @param limit 限制数量
     * @return 项目列表
     */
    List<CollaborationProject> getUserProjects(Long userId, String status, Integer limit);

    /**
     * 邀请成员加入项目
     *
     * @param projectId 项目ID
     * @param memberIds 成员ID列表
     * @param role 角色
     * @param userId 操作用户ID
     * @return 是否成功
     */
    boolean inviteMembers(String projectId, List<Long> memberIds, String role, Long userId);

    /**
     * 移除项目成员
     *
     * @param projectId 项目ID
     * @param memberId 成员ID
     * @param userId 操作用户ID
     * @return 是否成功
     */
    boolean removeMember(String projectId, Long memberId, Long userId);

    /**
     * 创建审批工作流
     *
     * @param workflowConfig 工作流配置
     * @param userId 用户ID
     * @return 工作流创建结果
     */
    WorkflowCreationResult createApprovalWorkflow(ApprovalWorkflowConfig workflowConfig, Long userId);

    /**
     * 启动工作流实例
     *
     * @param templateId 模板ID
     * @param pictureId 图片ID
     * @param variables 工作流变量
     * @param userId 发起人ID
     * @return 工作流实例ID
     */
    String startWorkflowInstance(String templateId, Long pictureId, Map<String, Object> variables, Long userId);

    /**
     * 处理工作流任务
     *
     * @param instanceId 实例ID
     * @param action 操作 (approve, reject, delegate)
     * @param comment 处理意见
     * @param userId 处理人ID
     * @return 是否成功
     */
    boolean processWorkflowTask(String instanceId, String action, String comment, Long userId);

    /**
     * 获取待处理任务
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 待处理任务列表
     */
    List<WorkflowInstance> getPendingTasks(Long userId, Integer limit);

    /**
     * 获取工作流实例详情
     *
     * @param instanceId 实例ID
     * @param userId 用户ID
     * @return 工作流实例
     */
    WorkflowInstance getWorkflowInstance(String instanceId, Long userId);

    /**
     * 版本控制管理
     *
     * @param imageUrl 图片URL
     * @param versionConfig 版本配置
     * @param userId 用户ID
     * @return 版本控制结果
     */
    VersionControlResult manageImageVersion(String imageUrl, ImageVersionConfig versionConfig, Long userId);

    /**
     * 创建版本分支
     *
     * @param imageId 图片ID
     * @param branchName 分支名称
     * @param userId 用户ID
     * @return 分支ID
     */
    String createVersionBranch(Long imageId, String branchName, Long userId);

    /**
     * 合并版本分支
     *
     * @param sourceBranch 源分支
     * @param targetBranch 目标分支
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean mergeVersionBranch(String sourceBranch, String targetBranch, Long userId);

    /**
     * 任务分配
     *
     * @param taskConfig 任务配置
     * @param userId 分配人ID
     * @return 任务分配结果
     */
    TaskAssignmentResult assignTask(TaskAssignmentConfig taskConfig, Long userId);

    /**
     * 更新任务状态
     *
     * @param taskId 任务ID
     * @param status 新状态
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean updateTaskStatus(String taskId, String status, Long userId);

    /**
     * 获取用户任务列表
     *
     * @param userId 用户ID
     * @param status 任务状态（可选）
     * @param limit 限制数量
     * @return 任务列表
     */
    List<Map<String, Object>> getUserTasks(Long userId, String status, Integer limit);

    /**
     * 管理看板
     *
     * @param boardConfig 看板配置
     * @param userId 用户ID
     * @return 看板管理结果
     */
    KanbanManagementResult manageKanbanBoard(KanbanBoardConfig boardConfig, Long userId);

    /**
     * 移动看板卡片
     *
     * @param cardId 卡片ID
     * @param targetColumnId 目标列ID
     * @param position 位置
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean moveKanbanCard(String cardId, String targetColumnId, Integer position, Long userId);

    /**
     * 添加协作评论
     *
     * @param imageUrl 图片URL
     * @param commentConfig 评论配置
     * @param userId 用户ID
     * @return 评论结果
     */
    CollaborationCommentResult addCollaborationComment(String imageUrl, CommentConfig commentConfig, Long userId);

    /**
     * 回复评论
     *
     * @param parentCommentId 父评论ID
     * @param content 回复内容
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean replyComment(String parentCommentId, String content, Long userId);

    /**
     * 删除评论
     *
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteComment(String commentId, Long userId);

    /**
     * 权限管理
     *
     * @param permissionConfig 权限配置
     * @param userId 用户ID
     * @return 权限管理结果
     */
    PermissionManagementResult managePermissions(PermissionManagementConfig permissionConfig, Long userId);

    /**
     * 检查用户权限
     *
     * @param userId 用户ID
     * @param resourceId 资源ID
     * @param permission 权限类型
     * @return 是否有权限
     */
    boolean checkPermission(Long userId, String resourceId, String permission);

    /**
     * 分配角色
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     * @param resourceId 资源ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean assignRole(Long userId, String roleId, String resourceId, Long operatorId);

    /**
     * 获取协作统计
     *
     * @param projectId 项目ID（可选）
     * @param userId 用户ID
     * @return 统计数据
     */
    Map<String, Object> getCollaborationStatistics(String projectId, Long userId);

    /**
     * 导出项目报告
     *
     * @param projectId 项目ID
     * @param reportType 报告类型
     * @param userId 用户ID
     * @return 报告文件URL
     */
    String exportProjectReport(String projectId, String reportType, Long userId);

    /**
     * 项目归档
     *
     * @param projectId 项目ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean archiveProject(String projectId, Long userId);

    /**
     * 项目恢复
     *
     * @param projectId 项目ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean restoreProject(String projectId, Long userId);
}
